package com.origin.chaos.framework.core;

import java.awt.*;
import java.io.Flushable;

/**
 * 像素画布接口，提供画布的基础配置信息的读写、画布像素位的设置等方法
 *
 * @author: tao.ding
 * @date 2021-07-02
 */
public interface PixelCanvas extends Flushable {

    /**
     * 获取画布ID
     *
     * @return 画布的ID
     */
    Long getId();

    /**
     * 获取画布名称
     *
     * @return 画布的名称
     */
    String getName();

    /**
     * 更新画布名称
     *
     * @param name 新的画布名称
     */
    void updateName(String name);

    /**
     * 获取画布宽（单位像素）
     *
     * @return 返回画布的宽（单位像素）
     */
    int getWidth();

    /**
     * 获取画布高（单位像素）
     *
     * @return 返回画布的高（单位像素）
     */
    int getHeight();

    /**
     * 获取画布总像素数量
     *
     * @return 返回总的像素数量
     */
    int getSize();

    /**
     * 获取两次绘画之间的间隔时间
     *
     * @return 两次绘画之间的间隔时间
     */
    int getPaintIntervalTime();

    /**
     * 更新两次绘画之间的间隔时间
     *
     * @param paintIntervalTime 新的两次绘画之间的间隔时间
     */
    void updatePaintIntervalTime(int paintIntervalTime);

    /**
     * 获取累计画过的点位
     *
     * @return 累计画过的点位
     */
    long getTotalPaintedPoints();

    /**
     * 累计画过的点位数量增加 var
     *
     * @param var 准备增加的数量
     */
    void incrPaintedPoint(long var);

    /**
     * 获取加入玩家数量
     *
     * @return 加入玩家数量
     */
    long getTotalJoinedUser();

    /**
     * 将用户加入到画布中
     *
     * @param userId 用户ID
     */
    void userJoin(long userId);

    /**
     * 更新像素
     *
     * @param hPos        y坐标
     * @param wPos        x坐标
     * @param colorRgbInt 颜色的rgb int值
     */
    void update(int hPos, int wPos, int colorRgbInt);

    /**
     * 初始化画布
     *
     * @param ifNewCreation 是否是新建画布，如果是，则初始化为纯白，否则从对应的数据源中加载
     */
    void init(boolean ifNewCreation);

    /**
     * 将画布初始化成纯色
     *
     * @param color
     */
    void initWithColor(Color color);

    /**
     * 获取像素数组的RGB int表示法
     *
     * @return
     */
    int[][] getRgbIntArray();

    /**
     * 获取像素数组的RGB 16进制字符串表示法
     *
     * @return
     */
    String[][] getRgbHexStringArray();

    /**
     * 获取画布当前图片字节数组
     *
     * @return
     */
    byte[] getCanvasImageByteArray();
}
